import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.LinkedList;


public class DataBase {

	String nombre;
	LinkedList<Tabla> tables;
	LinkedList<Procedure> procedures;
	LinkedList<Trigger> triggers;
//	LinkedList<ClaveForanea> clavesForaneas;

	public DataBase(String nombre){
		this.nombre = nombre ;
		tables = new LinkedList<Tabla>();
		procedures = new LinkedList<Procedure>();
		triggers = new LinkedList<Trigger>();
	//	clavesForaneas = new LinkedList<ClaveForanea>();
	}


	public String getNombre() {
		return nombre;
	}


	public void setNombre(String nombre) {
		this.nombre = nombre;
	}


	public LinkedList<Tabla> getTables() {
		return tables;
	}


	public void setTables(LinkedList<Tabla> tables) {
		this.tables = tables;
	}

	public void addTable(String nombre, ResultSet columnas, ResultSet pk,ResultSet foreings){
		LinkedList<String> pks = new LinkedList<String>();
		Tabla tablaNueva = new Tabla(nombre);		
		try {
			while(pk.next())
				pks.add(pk.getString(4));
			
			while(columnas.next()){
				String nombreColumna = columnas.getString(4);
				Columna col = new Columna(nombreColumna, false, columnas.getInt(5));
				if(pks.contains(nombreColumna))
					col.setPrimaryKey(true);
				tablaNueva.addColumna(col);
			}
			
			while(foreings.next()){
				ClaveForanea cf = new ClaveForanea(foreings.getString(12), foreings.getString(3), foreings.getString(8), foreings.getString(4));
				tablaNueva.addClaveForanea(cf);
			}
			
		} catch (SQLException e){
			e.printStackTrace();
		}
		this.tables.add(tablaNueva);
	}

	public void addProcedure(String nombre, ResultSet parametros){
		Procedure procedureNuevo = new Procedure(nombre);
		try {
			while(parametros.next()){
				Parametro param = new Parametro(parametros.getString(4),parametros.getInt(6), parametros.getInt(5));
				procedureNuevo.addParametro(param);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
		this.procedures.add(procedureNuevo);
	}


	public LinkedList<Procedure> getProcedures() {
		return procedures;
	}


	public void setProcedures(LinkedList<Procedure> procedures) {
		this.procedures = procedures;
	}
	
	public void addTrigger(String nombre,String evento,String condicion,String tabla){
		Trigger t = new Trigger(tabla, nombre, evento, condicion);
		this.triggers.add(t);
	}
	
	public LinkedList<Trigger> getTriggers(){
		return this.triggers;
	}
	
//	/**
//	 * @return the clavesForeaneas
//	 */
//	public LinkedList<ClaveForanea> getClavesForeaneas() {
//		return clavesForaneas;
//	}
//
//	/**
//	 * @param clavesForeaneas the clavesForeaneas to set
//	 */
//	public void setClavesForeaneas(LinkedList<ClaveForanea> clavesForeaneas) {
//		this.clavesForaneas = clavesForeaneas;
//	}
//	
//	public void addClaveForanea(String nombre, String referencia, String reglaUpdate, String reglaDelete){
//		ClaveForanea cf = new ClaveForanea(nombre, referencia, reglaUpdate, reglaDelete);
//		this.clavesForaneas.add(cf);
//	}

	/* (non-Javadoc)
	 * @see java.lang.Object#toString()
	 */
	@Override
	public String toString() {
		int i = 0;
		String res = "";
		res =  "Schema [nombre=" + nombre + "]\n";
		while(i < this.tables.size()){
			res = res + this.tables.get(i++).toString()+"\n";
		}
		res = res + "-------------------------------------------\n";
		return res;
	}
}
